home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / c / recio202.zip / rcbput.c < prev    next >
C/C++ Source or Header  |  1994-05-05  |  4KB  |  107 lines

  1. /*****************************************************************************
  2.    MODULE: rcbput.c
  3.   PURPOSE: recio column delimited integral number output functions
  4. COPYRIGHT: (C) 1994 William Pierpoint
  5.  COMPILER: Borland C Version 3.1
  6.        OS: MSDOS Version 6.2
  7.   VERSION: 2.02
  8.   RELEASE: May 5, 1994
  9. *****************************************************************************/
  10.  
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14.  
  15. #include "recio.h"
  16.  
  17. extern int _rstatus(REC *rp, int mode);
  18. extern int _rputc(REC *rp, int ch);
  19.  
  20. #define rfp(rp)          ((rp)->r_fp)
  21. #define rcol(rp)         ((rp)->r_colno)
  22. #define rfldch(rp)       ((rp)->r_fldch)
  23.  
  24. #define uint             unsigned int
  25. #define ulong            unsigned long
  26. #define UNSIGNED         0
  27. #define SIGNED           1
  28.  
  29. /****************************************************************************/
  30. static int                   /* return error (0=no error; !0=error)         */
  31.     _rcbputl(                /* put integral number to col delim rec stream */
  32.         REC   *rp,           /* pointer to record stream                    */
  33.         size_t begcol,       /* field inclusive beginning column            */
  34.         size_t endcol,       /* field inclusive ending column               */
  35.         int    base,         /* base (radix) (2 to 36)                      */
  36.         int    sign,         /* signed number?                              */
  37.         long   num)          /* number to put to stream                     */
  38. /****************************************************************************/
  39. {
  40.     int err=EOF;             /* return error (0=no error; !0=error) */
  41.     size_t sl;               /* length of _r_nsbuf */
  42.  
  43.     if (!_rstatus(rp, R_WRITE)) { 
  44.         if (endcol>=begcol && begcol>=rcolno(rp) && base>=2 && base<=36) {
  45.             rfldno(rp)++;
  46.             /* if colno < begcol, pad with spaces */
  47.             while (rcolno(rp) < begcol) {
  48.                 err = _rputc(rp, ' ');
  49.                 if (err) goto done;
  50.             }
  51.             if (sign) {
  52.                 ltoa(num, _r_nsbuf, base);
  53.             } else {
  54.                 ultoa((ulong)num, _r_nsbuf, base);
  55.             }
  56.             sl = strlen(_r_nsbuf); 
  57.             /* if converted string fits space */
  58.             if (sl <= (endcol-begcol+1)) { 
  59.                 while (rcolno(rp) <= endcol-sl) { 
  60.                     err = _rputc(rp, ' '); 
  61.                     if (err) goto done; 
  62.                 } 
  63.                 err = fputs(_r_nsbuf, rfp(rp)); 
  64.                 if (err==EOF) { 
  65.                     rseterr(rp, R_ENOPUT); 
  66.                 } else { 
  67.                     rcol(rp) += sl; 
  68.                     err = 0; 
  69.                 } 
  70.             /* else converted string too long for space */
  71.             } else { 
  72.                 rsetwarn(rp, R_WWIDTH); 
  73.                 while (rcolno(rp) <= endcol) { 
  74.                     err = _rputc(rp, '*'); 
  75.                 } 
  76.             } 
  77.         } else { 
  78.             rseterr(rp, R_EINVAL); 
  79.         } 
  80.     } 
  81. done: 
  82.     return err; 
  83. }
  84.  
  85. /****************************************************************************/
  86. /* column delimited integral number output functions                        */
  87. /****************************************************************************/
  88. int rcbputi(REC *rp, size_t begcol, size_t endcol, int base, int num)
  89. {
  90.     return _rcbputl(rp, begcol, endcol, base, SIGNED, (long) num);
  91. }
  92.  
  93. int rcbputui(REC *rp, size_t begcol, size_t endcol, int base, uint num)
  94. {
  95.     return _rcbputl(rp, begcol, endcol, base, UNSIGNED, (long) num);
  96. }
  97.  
  98. int rcbputl(REC *rp, size_t begcol, size_t endcol, int base, long num)
  99. {
  100.     return _rcbputl(rp, begcol, endcol, base, SIGNED, num);
  101. }
  102.  
  103. int rcbputul(REC *rp, size_t begcol, size_t endcol, int base, ulong num)
  104. {
  105.     return _rcbputl(rp, begcol, endcol, base, UNSIGNED, (long) num);
  106. }
  107.